import numpy as np
import matplotlib.pyplot as plt

# 中文和负号的正常显示
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建x值，排除x=0点
x = np.linspace(-0.1, 0.1, 1000)
x = x[x != 0]  # 排除零点

# 计算函数值
f_x = x**2 * np.sin(1/x)  # 目标函数
lower_bound = -x**2  # 下界函数
upper_bound = x**2   # 上界函数

# 绘制图像
plt.figure(figsize=(12, 6))
plt.plot(x, f_x, label=r'$g(x) = x^2 \sin(1/x)$', linewidth=2)
plt.plot(x, lower_bound, 'r--', label=r'$f(x) = -x^2$')
plt.plot(x, upper_bound, 'r--', label=r'$h(x) = x^2$')
plt.fill_between(x, lower_bound, upper_bound, color='red', alpha=0.1, label='夹逼区域')
plt.axhline(y=0, color='k', linestyle=':', alpha=0.5, label='极限值 A=0')
plt.axvline(x=0, color='gray', linestyle=':', alpha=0.5)
plt.xlabel('x')
plt.ylabel('y')
plt.title(r'夹逼定理验证：$x^2 \sin(1/x)$ 的极限')
plt.legend()
plt.grid(True, alpha=0.3)
plt.ylim(-0.001, 0.001)
plt.show()

# 计算x趋近于0时的函数值
print("x趋近于0时函数值的变化：")
x_values = [0.1, 0.01, 0.001, 0.0001]
for x_val in x_values:
    g_val = x_val**2 * np.sin(1/x_val)
    lower_val = -x_val**2
    upper_val = x_val**2
    print(f"x = {x_val:.4f}, g(x) = {g_val:.8f}, 下界 = {lower_val:.8f}, 上界 = {upper_val:.8f}")